In diesem Kapitel schauen wir uns zwei verschiedene Arten an, wie man ein XML-Dokument elektronisch verarbeiten kann. Es geht um die Technologien DOM und SAX zum XML-Parsing. Was ist ein XML-Parser? XML-Parser können anhand zweier Kriterien unterschieden werden: Das erste Kriterium lautet: Sie sind validierend oder nichtvalidierend. Nichtvalidierende Parser kontrollieren lediglich, ob das Dokument wohlgeformt ist, also ob es den Spezifikationen des W3C entspricht. Validierende Parser prüfen zusätzlich die Konformität gegenüber einer DTD oder einem XML Schema. Das zweite Kriterium lautet: Sie greifen auf den XML-Baum zu, also auf dessen Document Object Model (DOM) oder sequentiell auf einen XML-Datenstrom durch Verwendung der Simple API for XML (SAX). DOM ist ein Standard des W3C. Beim DOM-Parsen wird das XML-Dokument zunächst in einer Baum-Struktur angelegt, dem DOM-Baum. Das Root-Element des XML-Dokuments fungiert als Wurzel für den DOM-Baum. Dieser Baum steht dann als Abbild des XML-Dokuments im Speicher zur Verfügung und kann beliebig navigiert werden. Jede HTML5-Datei ist auch ein DOM-Baum. Die Folie zeigt ein Beispiel für ein XML-Dokument und illustriert, wie Informationen über Bücher strukturiert und gespeichert werden können. Das Dokument beginnt mit der XML-Deklaration, die die Version von XML spezifiziert. Das Hauptelement des Dokuments ist "books", das alle Buchinformationen umschließt. Innerhalb des books-Elements befindet sich ein book-Element, das die Details eines einzelnen Buches enthält. Das book-Element enthält mehrere Kindelemente, die spezifische Informationen über das Buch speichern. Das erste Kindelement ist author, das den Autor des Buches mit dem Wert "Carson" angibt. Das nächste Kindelement ist price, das den Preis des Buches angibt. Dieses Element hat ein Attribut format mit dem Wert "dollar", was darauf hinweist, dass der Preis in US-Dollar angegeben ist. Der Preis des Buches beträgt einunddreißig-komma-neun-fünf Dollar. Anschließend folgt das pubdate-Element, das das Veröffentlichungsdatum des Buches enthält, hier angegeben als fünfter-erster-zweitausendeins. Zusätzlich zu den grundlegenden Buchinformationen enthält das book-Element ein weiteres Kindelement namens pubinfo, das zusätzliche Veröffentlichungsinformationen speichert. Innerhalb von pubinfo befinden sich zwei weitere Kindelemente: publisher, das den Verlag "MSPress" angibt, sowie state, das den US-Bundesstaat Washington angibt, in dem der Verlag ansässig ist. Bitte überlegen Sie sich, wie man diese Struktur noch optimieren könnte. Die Folie zeigt die Struktur eines XML-Dokuments und dessen Darstellung im DOM. Ganz oben im Baum befindet sich das Wurzelelement, das als "Dokument" bezeichnet wird. Von diesem Wurzelelement gehen zwei Hauptzweige aus: ein Zweig führt zu einem Element namens "xml" und der andere zu einem Element namens "Bücher". Diese beiden Zweige repräsentieren die oberste Ebene des XML-Dokuments. Unterhalb des "Bücher"-Elements gibt es weitere Verzweigungen, die die einzelnen Komponenten des Buches darstellen. Das "Buch"-Element ist ein Kind des "Bücher"-Elements und hat selbst mehrere Kindelemente, die die spezifischen Eigenschaften des Buches beschreiben. Die erste Verzweigung vom "Buch"-Element führt zu einem "Autor"-Element, das den Namen des Autors enthält, in diesem Fall "Carson". Ein weiterer Zweig führt zu einem "Preis"-Element, das den Preis des Buches angibt. Das "Preis"-Element hat ein Attribut namens "Format", das den Preis in US-Dollar angibt. Der Wert des Preis-Elements ist einunddreißig-komma-neun-fünf. Eine weitere Verzweigung führt zu einem "pubdate"-Element, das das Veröffentlichungsdatum des Buches enthält, hier als erster-fünfter-zweitausendeins dargestellt. Diese Informationen beschreiben die grundlegenden Metadaten des Buches. Zusätzlich gibt es ein "pubinfo"-Element, das zusätzliche Verlagsinformationen enthält. Dieses Element hat zwei Kindelemente: "Herausgeber" und "Zustand". Das "Herausgeber"-Element enthält den Namen des Verlags, in diesem Fall "MSPress", während das "Zustand"-Element den Zustand oder den Standort des Verlags angibt, hier als "W A" für Washington dargestellt. Bitte überlegen Sie sich auch, wie man diese Struktur noch optimieren könnte. Und wo gibt es Abweichungen zum XML-Dokument der vorherigen Folie? Eine DOM-API bietet Werkzeuge zum Zugriff auf den Baum und zum Verändern des Baums und ist deshalb ideal für interaktive Anwendungen geeignet. Das gesamte Object Model steht die ganze Zeit im Speicher zur Verfügung. Diese DOM-Struktur ist in der Regel objektorientiert und damit sehr speicherlastig. Hier haben wir ein weiteres XML-Dokument. Es beginnt wie immer mit der XML-Deklaration, die die Version von XML spezifiziert. Danach kommt das Wurzelelement "company", das eine Liste von "staff"-Elementen besitzt. Jeder Mitarbeiter hat als Attribut eine ID, was einer Personalnummer entsprechen könnte. Außerdem hat jeder der beiden Mitarbeiter vier Kind-Elemente, nämlich "firstname", "lastname", "nickname" sowie "salary". Dieses Dokument lesen wir nun mit einem kleinen Java-Programm vollständig ein. Dies geschieht über eine DocumentBuilderFactory, aus der letztlich das Dokument als Objekt-Repräsentation im Heap der VM entsteht. Nun wird jeder Knoten der Liste "staff" nacheinander in der for-Schleife durchgegangen und sowohl die ID, als auch die Elemente jedes Mitarbeiters auf der Konsole ausgegeben. Die Ausgabe auf der Konsole sieht dann wie folgt aus. Diese Daten können statt der Konsolenausgabe beispielsweise auch in ein SQL-Statement gesetzt und von dort aus in eine Datenbank geschrieben werden. Und was ist nun SAX? SAX wurde ursprünglich in Java entwickelt und besteht aus einer Anzahl von Java-Interfaces; heute finden sich jedoch Implementierungen für nahezu alle gängigen Programmiersprachen. SAX unterliegt keinem formalen Konsortium, dennoch ist es ein De-facto-Standard. Es spezifiziert eine Menge von Methoden für den Zugriff auf XML-Dokumente mittels eines SAX-Parsers. SAX arbeitet, anders als DOM, ereignisorientiert. Das Verarbeitungsprinzip entspricht dem Konzept einer Pipeline. SAX definiert eine Menge von Ereignissen, die beim sequentiellen Lesen eines XML-Dokuments vorkommen können. Diese Ereignisse sind zustandslos, sie referenzieren nicht auf andere, vorhergegangene Ereignisse und stehen auch sonst in keinem Verhältnis zu anderen Ereignissen. Beim Erkennen einer syntaktischen Struktur startet der SAX-Parser eine Behandlungsroutine, welche gegebenenfalls eine individuelle Behandlungsroutine des Ereignisses ausführt. Hierdurch kann mit dem Einlesen der ersten Zeichen bereits mit der Auswertung des Dokuments begonnen werden. Dies verkürzt insbesondere in interaktiven Systemen die subjektiv gefühlte Zugriffszeit. Gleichzeitig minimiert der SAX-Parser den Speicherbedarf, da neben dem jeweils eingelesenen Element nur solche Daten im Speicher stehen, die mittels einer Behandlungsroutine explizit ausgewählt wurden. Hier nun ein weiteres XML-Dokument. Nach der XML-Deklaration lautet das Wurzelelement hier "seminararbeit". Die Seminararbeit hat einen Titel und einen Inhalt, der aus drei Kapiteln besteht. Jedes Kapitel-Element hat als Attribut eine anscheinend fortlaufende Nummer sowie eine Beschreibung als Inhalt des Elements. Wenn man dieses Dokument nun mit SAX verarbeiten will, werden beim Einlesen Java-Methoden nacheinander aufgerufen. Solche Java-Methoden können startDocument, startElement, characters oder endElement sein. Die Methode "startDocument" wird aufgerufen, wenn der Parser auf den Anfang des XML-Dokuments gestoßen ist. Der Aufruf der Methode "startElement" mit dem Eingabeparameter "seminararbeit" bedeutet, dass gerade der Beginn des Wurzelements eingelesen wurde. Der zweite Parameter ist eine Liste aller zum Element gehörenden Attribute. Da dieses Element allerdings keine Attribute hat, ist diese Liste in diesem Fall leer. Auf dieselbe Weise werden auch die anderen Methoden aufgerufen. Ihr Java-Programm sollte nun über einen inneren Zustand verfügen, in dem sich der aktuelle Stand des Dokuments gemerkt wird. Auf diese Weise könnte dann beispielsweise ein Kapitel nach dem anderen in eine Datenbank geschrieben werden, ohne dass sich das ganze XML-Dokument im Speicher befinden muss.